/**
 * 组件，需添加组件请移步 src/components
 * @author luguoxiang
 * @date 2021-09-07
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
import { Component } from 'vue';
import {
  BaseTableCol,
  ColProps,
  DatePickerProps,
  EnhancedTableProps,
  FormItemProps,
  PaginationProps,
  RowProps,
  TimePickerProps,
} from 'tdesign-vue-next';
import {
  BizSelectOptions,
  BizTreeOptions,
  IComponentProps,
  IConfigSchema,
  IDetailSchema,
  IFormSchema,
  ISearchSchema,
  ITableSchema,
} from '@/soar';

/**
 * 日期范围组件
 */
export declare interface LgRangeDateProps extends IComponentProps {
  dateProps?: DatePickerProps;
  parser?(v: any): [string, string];
  formatter?(p: [string, string]): any;
  placeholder?: string | [string, string];
}

/**
 * 时间范围组件
 */
export declare interface LgRangeTimeProps {
  timeProps?: TimePickerProps;
  parser?(v: any): [string, string];
  formatter?(p: [string, string]): any;
  placeholder?: string | [string, string];
}

/**
 * 数据字典组件
 */
export declare interface LgDictProps {
  /**
   * 字典code
   */
  code: string;
  /**
   * 隐藏的值
   */
  hiddenValue?: number | number[] | string;
  /**
   * 禁用的值
   */
  disabledValue?: number | number[] | string;
  /**
   * 数据处理器
   */
  handler?: Function;
  /**
   * 使用的组件
   */
  component?: Component | string;
}

/**
 * 业务选择组件
 */
export declare interface LgBizSelectProps extends BizSelectOptions {
  /**
   * 搜索字段或true，为字符串时远程搜索具体字段，为true时本地筛选label
   */
  search?: string | boolean;
  /**
   * 使用的组件(可以是组件引入对象或字符串（全局引入的）)
   */
  component?: string | Component;
}

/**
 * 业务树形数据组件
 */
export declare interface LgBizTreeProps extends BizTreeOptions {
  /**
   * 搜索字段或true，为字符串时远程搜索具体字段，为true时本地筛选label
   */
  search?: string | boolean;
  /**
   * 使用的组件(可以是组件引入对象或字符串（全局引入的）)
   */
  component?: string | Component;
}

/**
 * 自动宫格布局组件
 */
export declare interface LgGridProps {
  /**
   * 列宽度
   */
  width?: number;
  /**
   * 间距，数组时第一个是垂直间距，第二个是水平间距
   */
  gap?: number | [number, number];
  /**
   * 是否禁用列宽计算（js动态宫格功能失效，不随窗口父元素宽度变化自动计算宫格宽度）
   */
  disabled?: boolean;
  /**
   * 最少列数
   */
  minColumn?: number;
  /**
   * 最大列数
   */
  maxColumn?: number;
}

/**
 * 详情数据组件
 */
export declare interface LgDescriptionProps<T> {
  /**
   * 表单配置
   */
  schema?: IDetailSchema<T>[] | IConfigSchema<T>[];
  /**
   * 初始数据
   */
  data?: T;
  /**
   * 宫格类型，lg：使用LgGrid，rw：使用 t-row t-col
   */
  gridType?: 'lg' | 'rw';
  /**
   * LgGrid 宫格配置属性
   */
  gridProps?: LgGridProps | RowProps;
  /**
   * label宽度
   */
  labelWidth?: string;
  /**
   * 列配置属性
   */
  colProps?: IComponentProps | ColProps;
  /**
   * 标题元素配置
   */
  labelProps?: IComponentProps;
  /**
   * 值元素配置
   */
  valueProps?: IComponentProps;
}

/**
 * 表单组件
 */
export declare interface LgFormProps<T> {
  /**
   * 表单配置
   */
  schema?: IFormSchema<T>[] | IConfigSchema<T>[];
  /**
   * 初始数据
   */
  data?: T;
  /**
   * 是否是更新
   */
  isUpdate?: boolean;
  /**
   * 宫格类型，lg：使用LgGrid，rw：使用 t-row t-col
   */
  gridType?: 'lg' | 'rw';
  /**
   * LgGrid 宫格配置属性
   */
  gridProps?: LgGridProps | RowProps;
  /**
   * 列配置属性
   */
  colProps?: IComponentProps | ColProps;
  /**
   * el-form-item 配置属性
   */
  formItemProps?: FormItemProps;
}

/**
 * 搜索栏组件
 */
export declare interface LgSearchBarProps<T> {
  /**
   * 表单配置
   */
  schema?: ISearchSchema<T>[] | IConfigSchema<T>[];
  /**
   * 宫格配置
   */
  gridProps?: LgGridProps;
  /**
   * 自动去空格
   */
  autoTrim?: boolean;
}

/**
 * 表格组件
 */
export declare interface LgTableProps<T> {
  /**
   * 多列配置
   */
  schema?: ITableSchema<T>[] | IConfigSchema<T>[];
  /**
   * 数据配置
   */
  data?: Function | string | any[];
  /**
   * 查询字段配置
   */
  fields?: string | string[];
  /**
   * 默认排序字段（优先级低于列配置）
   */
  orderBys?: string | string[];
  /**
   * 搜索栏配置
   */
  searchbar?: LgSearchBarProps<T> | boolean;
  /**
   * 工具栏
   */
  toolbar?: boolean;
  /**
   * 已选栏
   */
  alert?: boolean;
  /**
   * 分页配置
   */
  pagination?: PaginationProps | boolean;
  /**
   * 列默认配置
   */
  column?: BaseTableCol;
  /**
   * 多选框列
   */
  selection?: BaseTableCol | boolean;
  /**
   * 序号列
   */
  index?: BaseTableCol | boolean;
  /**
   * 操作列
   */
  actionbar?: BaseTableCol | boolean;
  /**
   * 是否立即加载数据
   */
  immediate?: boolean;
  /**
   * id字段
   */
  rowKey?: string;
  /**
   * t-table 配置
   */
  tableProps?: EnhancedTableProps;
  /**
   * 参数处理
   * @param soarQueryParams 经过 soarQuery 处理的参数
   * @param raw 原始参数
   */
  paramsHandle?(soarQueryParams: any, raw?: any): unknown;
  /**
   * 数据处理
   * @param data
   */
  dataHandle?(data: any): unknown;
  /**
   * 实例引用
   */
  ref?(e: any): void;
}

/**
 * 格式化
 */
export declare interface LgFormatProps {
  /**
   * 格式
   */
  format?: 'bigNumber' | 'number' | 'datetime' | 'date' | 'time' | 'CNY' | 'USD' | string;
  /**
   * 值
   */
  value?: any | any[];
}

/**
 * 文本翻译组件
 */
export declare interface LgTextProps {
  /**
   * 通过接口获取
   */
  api?: string | Function;
  /**
   * 数据选项
   */
  options?: Object[] | string;
  /**
   * 值
   */
  modelValue?: Object | Object[];
  /**
   * 翻译结果连接符
   */
  join?: string;
  /**
   * 值字段
   */
  valueField?: string;
  /**
   * label字段
   */
  labelField?: string;
}

/**
 * 文件上传组件
 */
export declare interface LgUploadProps {
  /**
   * 值类型
   */
  valueType?: 'default' | 'infoList' | 'urlList' | 'url' | 'info';

  /**
   * 文件列表类型
   */
  type?: 'img' | 'table' | 'list';

  /**
   * 文件类型限制
   */
  accept?: string;

  /**
   * 文件数量限制
   */
  limit?: number | string;

  /**
   * 文件大小限制
   */
  size?: number | string;

  /**
   * 是否禁用
   */
  disabled?: boolean;

  /**
   * 是否手动上传
   */
  manual?: boolean;

  /**
   * 固定触发按钮（文件达到数量限制不隐藏触发按钮）
   */
  fixedTrigger?: boolean;
}
